package br.org.ifrr.repository;

import java.io.Serializable;
import java.util.List;

import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.org.ifrr.model.Usuario;
import br.org.ifrr.repository.filter.UsuarioFilter;

public class Usuarios implements Serializable {

	private static final long serialVersionUID = 1L;

	
	
	@Inject
	private EntityManager manager;

	public Usuario porId(Long id) {
		return manager.find(Usuario.class, id);
	}

	public Usuario guardar(Usuario usuario) {
		return manager.merge(usuario);
	}

	public Usuario porLogin(String login) {

		try {
			return manager.createQuery("from Usuario where lower(login) = :login", Usuario.class)
					.setParameter("login", login.toLowerCase())
					.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}

	}

	@SuppressWarnings("unchecked")
	public List<Usuario> filtrados(UsuarioFilter filtro) {
		Session session = manager.unwrap(Session.class);
		Criteria criteria = session.createCriteria(Usuario.class);

		if (StringUtils.isNotBlank(filtro.getNome())) {
			criteria.add(Restrictions.ilike("nome", filtro.getNome(),
					MatchMode.ANYWHERE));
		}

		return criteria.addOrder(Order.asc("nome")).list();
	}

	public List<Usuario> porNome(String nome) {
		return this.manager
				.createQuery("from Usuario where upper(nome) like :nome",
						Usuario.class)
				.setParameter("nome", nome.toUpperCase() + "%").getResultList();
	}

	public Usuario porLoginSpring(String login) {
		Usuario usuario = null;

		try {
			return manager
					.createQuery("from Usuario where lower(login) = :login", Usuario.class)
					.setParameter("login", login.toLowerCase())
					.getSingleResult();
		} catch (NoResultException e) {
			return usuario;
		}
	}
}
